﻿namespace che13
{
    internal class Text10
    {
        static void Main(string[] args)
        {
            Console.WriteLine("逻辑运算符");
            //对bool进行逻辑运算
            //1.逻辑“与”
            //符号&&  并且
            //规则：对两个bool值进行逻辑运算，有假则假，同真为真
            bool result = true && false;
            Console.WriteLine(result);//false（有一个假，结果都是假，在前在后都一样）
            result = true && true;
            Console.WriteLine(result);//true（都是真的，结果才是真的）

            //bool相关的类型  bool变量   条件运算符
            //逻辑运算符优先级  低于  条件运算符  算术运算符
            result = 3 > 1 && 1 > 2;//false
            Console.WriteLine(result);

            int i = 3;
            result = i > 1 && i < 4;//true
            //↑就相当于1<i<4
            //true&&true

            //多个逻辑与 组合应用
            int i2 = 5;
            result = i2 > 1 && i2 < 4 && i2 != 2;//false
            //true&&false&&false
            Console.WriteLine(result);
            //没括号按顺序算，有括号先算括号

            //逻辑或
            //符号||  或者
            //规则：对两个bool值进行逻辑运算  有真则真，同假为假
            result = true || false;
            Console.WriteLine(result);//true
            result = false || false;
            Console.WriteLine(result);//false
            result = true || true;
            Console.WriteLine(result);
            //基本同上
            result = 3 > 4 || 1 > 2;//false
            Console.WriteLine(result);
            int a = 2, b = 3;
            result = a > 2 || b > a || b == 3;//true
            //false||true||true
            Console.WriteLine(result);

            //与和或基本相同

            //逻辑非
            //符号：!
            //规则：对一个bool值进行取反   真变假，假变真
            result = !true;
            Console.WriteLine(result);//false
            result = !false;
            Console.WriteLine(result);//true
            result = !!true;//true
            Console.WriteLine(result);
            result = !(1 < 3);//逻辑非优先级高，所以要加括号
            Console.WriteLine(result);//false

            //4.混合使用优先级问题
            //规则：!（逻辑非）优先级最高
            //          &&（逻辑与）优先级高于||（逻辑或）
            //逻辑运算符优先级 低于 算术运算符 条件运算符（逻辑非除外，级别最高）
            bool gameOver = false;
            int hp = 100;
            bool isDead = false;
            bool isMustOver = true;

            result = gameOver || hp < 0 && !isDead || isMustOver;
            //result=false||false&&true||true
            //result=false||false||true
            //result=true
            Console.WriteLine(result);
            //5.逻辑运算符短路规则
            //有真则真
            //只要逻辑与 或 逻辑或 左边满足了条件
            //i3>0 true
            int i3 = 1;
            result = i3 > 0 || ++i3 >= 1;
            Console.WriteLine(i3);//这里i3是1的原因是↑||左边是true，所以就会短路（就是后面忽略不算了，不重要了，所以++i3没有计算）

            //有假则假（同上）
            result = i3 > 0 && i3++ > 1;//这里同上，左边是false所以右边忽略不算，不重要了（也就是短路）
            Console.WriteLine(result);

            //作业
            //1.求打印结果是什么？
            Console.WriteLine(true || true);//true
            Console.WriteLine(false || true);//true
            Console.WriteLine(true && true);//true
            Console.WriteLine(true && false);//false
            Console.WriteLine(!true);//false

            //2.求打印结果是什么？
            bool gameOver1;
            bool isWin;
            int health = 100;
            gameOver1 = true;
            isWin = false;
            Console.Write(gameOver1 || isWin && health > 0);
            //true||false
            //结果：true
        }
    }
}
